﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace JGSY.Tasks
{
    public static class Mutex1
    {
        // 1. 创建命名 Mutex（支持跨进程）
        public static Mutex _mutex = new Mutex(false, "Global\\MyAppMutex"); // 全局命名空间（Windows）
                                                                      // static Mutex _mutex = new Mutex(false, "MyAppMutex");     // 本地会话（非跨进程）

        public static void Mutex001()
        {
            Console.WriteLine("等待获取 Mutex...");

            // 2. 尝试获取 Mutex（带超时）
            if (_mutex.WaitOne(3000)) // 等待3秒
            {
                try
                {
                    Console.WriteLine("Mutex 获取成功！当前进程ID: " + System.Diagnostics.Process.GetCurrentProcess().Id);

                    // 3. 模拟临界区操作（共享资源访问）
                    ProcessSharedResource();

                    // 4. 模拟耗时操作（按住 Ctrl+F5 启动多个实例测试）
                    Thread.Sleep(5000);
                }
                finally
                {
                    // 5. 必须释放 Mutex
                    _mutex.ReleaseMutex();
                    Console.WriteLine("Mutex 已释放");
                }
            }
            else
            {
                Console.WriteLine("Mutex 获取超时");
            }

            // 6. 跨进程测试：启动多个实例观察控制台输出顺序
            Console.ReadLine();
        }

        static void ProcessSharedResource()
        {
            // 模拟共享资源访问（如文件写入、硬件操作）
            Console.WriteLine("正在处理共享资源...");
        }
    }
}
